package cn.iocoder.yudao.module.aiposter.service.template;

import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
import cn.iocoder.yudao.module.aiposter.dal.mysql.template.AppTemplateMapper;
import cn.iocoder.yudao.module.aiposter.remote.DrawClient;
import cn.iocoder.yudao.module.aiposter.remote.ImgClient;
import cn.iocoder.yudao.module.aiposter.remote.VecClient;
import cn.iocoder.yudao.module.aiposter.remote.vo.VecDBItemReq;
import cn.iocoder.yudao.module.aiposter.service.poster.bo.ImgDataInfoBO;
import cn.iocoder.yudao.module.aiposter.service.poster.bo.ImgWidgetBO;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

import org.springframework.validation.annotation.Validated;

import java.util.*;

import cn.iocoder.yudao.module.aiposter.controller.app.template.vo.*;
import cn.iocoder.yudao.module.aiposter.dal.dataobject.template.TemplateDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.aiposter.enums.ErrorCodeConstants.*;

/**
 * 模版信息 Service 实现类
 *
 * @author Rain
 */
@Service
@Validated
public class AppTemplateServiceImpl implements AppTemplateService {

    @Resource
    private AppTemplateMapper appTemplateMapper;

    @Resource
    private VecClient vecClient;

    @Override
    public Long createTemplate(AppTemplateSaveReqVO createReqVO) {
        // 插入
        TemplateDO template = BeanUtils.toBean(createReqVO, TemplateDO.class);
        appTemplateMapper.insert(template);

        // 插入向量库
        boolean isAI = judgeIsAI(template.getData());
        boolean isSegmentation = judgeIsSegmentation(template.getData());
        VecDBItemReq vecReq = VecDBItemReq.builder()
                .templateId(template.getId())
                .bizName(template.getBizName())
                .keyword(template.getKeyword())
                .isAI(isAI)
                .isSegmentation(isSegmentation)
                .build();
        vecClient.add(vecReq);

        // 返回
        return template.getId();
    }

    @Override
    public void updateTemplate(AppTemplateSaveReqVO updateReqVO) {
        // 校验存在
        validateTemplateExists(updateReqVO.getId());
        // 更新
        TemplateDO updateObj = BeanUtils.toBean(updateReqVO, TemplateDO.class);
        appTemplateMapper.updateById(updateObj);

        // 向量库更新
        boolean isAI = judgeIsAI(updateObj.getData());
        boolean isSegmentation = judgeIsSegmentation(updateObj.getData());
        VecDBItemReq vecReq = VecDBItemReq.builder()
                .templateId(updateObj.getId())
                .bizName(updateObj.getBizName())
                .keyword(updateObj.getKeyword())
                .isAI(isAI)
                .isSegmentation(isSegmentation)
                .build();
        vecClient.add(vecReq);
    }

    @Override
    public void deleteTemplate(Long id) {
        // 校验存在
        validateTemplateExists(id);
        // 删除
        appTemplateMapper.deleteById(id);

        // 向量库删除
        VecDBItemReq vecReq = VecDBItemReq.builder()
                .templateId(id)
                .build();
        vecClient.delete(vecReq);
    }

    private void validateTemplateExists(Long id) {
        if (appTemplateMapper.selectById(id) == null) {
            throw exception(TEMPLATE_NOT_EXISTS);
        }
    }

    @Override
    public TemplateDO getTemplate(Long id) {
        return appTemplateMapper.selectById(id);
    }

    @Override
    public List<TemplateDO> getTemplates(List<Long> ids) {
        QueryWrapperX<TemplateDO> queryWrapperX = new QueryWrapperX<>();
        queryWrapperX.inIfPresent("id", ids);
        return appTemplateMapper.selectList(queryWrapperX);
    }

    @Override
    public PageResult<TemplateDO> getTemplatePage(AppTemplatePageReqVO pageReqVO) {
        return appTemplateMapper.selectPage(pageReqVO);
    }


    /**
     * 判断是否是抠图模版
     *
     * @param data 图层json信息
     * @return 是否抠图模版
     */
    public boolean judgeIsSegmentation(String data) {
        ImgDataInfoBO imgDataInfoBO = JsonUtils.parseObject(data, ImgDataInfoBO.class);
//        ImgPageBO imgDataPage = imgDataInfoBO.getPage();
        List<ImgWidgetBO> imgWidgetBOList = imgDataInfoBO.getWidgets();
        for (ImgWidgetBO item : imgWidgetBOList) {
            if (item.getIsSegmentation()) {
                return true;
            }
        }
        return false;
    }

    /**
     * 判断是否是AI生图模版
     *
     * @param data 图层json信息
     * @return 是否生图模版
     */
    public boolean judgeIsAI(String data) {
        ImgDataInfoBO imgDataInfoBO = JsonUtils.parseObject(data, ImgDataInfoBO.class);
//        ImgPageBO imgDataPage = imgDataInfoBO.getPage();
        List<ImgWidgetBO> imgWidgetBOList = imgDataInfoBO.getWidgets();
        for (ImgWidgetBO item : imgWidgetBOList) {
            if (item.getIsAI()) {
                return true;
            }
        }
        return false;
    }
}